/*
 *
 *  * Copyright (c) iwindplus Technologies Co., Ltd.2024-2030, All rights reserved.
 *
 *
 */

package com.iwindplus.base.http.client.manager;

import com.iwindplus.base.util.OkhttpUtil;
import jakarta.annotation.Resource;
import java.util.List;
import java.util.Map;
import lombok.extern.slf4j.Slf4j;
import okhttp3.OkHttpClient;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.web.multipart.MultipartFile;

/**
 * OkHttpClient 工具管理器.
 *
 * @author zengdegui
 * @since 2025/02/15 21:45
 */
@Slf4j
public class OkHttpClientManager {

    @Resource
    private OkHttpClient httpClient;

    /**
     * get同步请求（参数拼接）.
     *
     * @param url    路径（必填）
     * @param header 请求头（可选）
     * @param param  参数（可选）
     * @param clazz  返回值类型
     * @param <T>    泛型
     * @return T
     */
    public <T> T httpGet(String url, Map<String, String> header, Map<String, Object> param, Class<T> clazz) {
        return OkhttpUtil.httpGet(this.httpClient, url, header, param, clazz);
    }

    /**
     * get同步请求（参数拼接）.
     *
     * @param url     路径（必填）
     * @param header  请求头（可选）
     * @param param   参数（可选）
     * @param typeRef 返回值类型
     * @param <T>     泛型
     * @return T
     */
    public <T> T httpGet(String url, Map<String, String> header, Map<String, Object> param, ParameterizedTypeReference<T> typeRef) {
        return OkhttpUtil.httpGet(this.httpClient, url, header, param, typeRef);
    }

    /**
     * post同步请求（json）.
     *
     * @param url    路径（必填）
     * @param header 请求头（可选）
     * @param json   参数（必填）
     * @param clazz  返回值类型
     * @param <T>    泛型
     * @return T
     */
    public <T> T httpPostByJson(String url, Map<String, String> header, String json, Class<T> clazz) {
        return OkhttpUtil.httpPostByJson(this.httpClient, url, header, json, clazz);
    }

    /**
     * post同步请求（json）.
     *
     * @param url     路径（必填）
     * @param header  请求头（可选）
     * @param json    参数（必填）
     * @param typeRef 返回值类型
     * @param <T>     泛型
     * @return T
     */
    public <T> T httpPostByJson(String url, Map<String, String> header, String json, ParameterizedTypeReference<T> typeRef) {
        return OkhttpUtil.httpPostByJson(this.httpClient, url, header, json, typeRef);
    }

    /**
     * post同步请求（FormBody表单）.
     *
     * @param url    路径（必填）
     * @param header 请求头（可选）
     * @param param  参数（可选）
     * @param clazz  返回值类型
     * @param <T>    泛型
     * @return T
     */
    public <T> T httpPostByForm(String url, Map<String, String> header, Map<String, Object> param, Class<T> clazz) {
        return OkhttpUtil.httpPostByForm(this.httpClient, url, header, param, clazz);
    }

    /**
     * post同步请求（FormBody表单）.
     *
     * @param url     路径（必填）
     * @param header  请求头（可选）
     * @param param   参数（可选）
     * @param typeRef 返回值类型
     * @param <T>     泛型
     * @return T
     */
    public <T> T httpPostByForm(String url, Map<String, String> header, Map<String, Object> param, ParameterizedTypeReference<T> typeRef) {
        return OkhttpUtil.httpPostByForm(this.httpClient, url, header, param, typeRef);
    }

    /**
     * post同步请求（MultipartBody表单）.
     *
     * @param url    路径（必填）
     * @param header 请求头（可选）
     * @param param  参数（可选）
     * @param files  文件集合（可选）
     * @param clazz  返回值类型
     * @param <T>    泛型
     * @return T
     */
    public <T> T httpPostByMultipart(String url, Map<String, String> header, Map<String, Object> param, List<MultipartFile> files, Class<T> clazz) {
        return OkhttpUtil.httpPostByMultipart(this.httpClient, url, header, param, files, clazz);
    }

    /**
     * post同步请求（MultipartBody表单）.
     *
     * @param url     路径（必填）
     * @param header  请求头（可选）
     * @param param   参数（可选）
     * @param files   文件集合（可选）
     * @param typeRef 返回值类型
     * @param <T>     泛型
     * @return T
     */
    public <T> T httpPostByMultipart(String url, Map<String, String> header, Map<String, Object> param, List<MultipartFile> files,
        ParameterizedTypeReference<T> typeRef) {
        return OkhttpUtil.httpPostByMultipart(this.httpClient, url, header, param, files, typeRef);
    }

    /**
     * put同步请求（json）.
     *
     * @param url    路径（必填）
     * @param header 请求头（可选）
     * @param json   参数（必填）
     * @param clazz  返回值类型
     * @param <T>    泛型
     * @return T
     */
    public <T> T httpPutByJson(String url, Map<String, String> header, String json, Class<T> clazz) {
        return OkhttpUtil.httpPutByJson(this.httpClient, url, header, json, clazz);
    }

    /**
     * put同步请求（json）.
     *
     * @param url     路径（必填）
     * @param header  请求头（可选）
     * @param json    参数（必填）
     * @param typeRef 返回值类型
     * @param <T>     泛型
     * @return T
     */
    public <T> T httpPutByJson(String url, Map<String, String> header, String json, ParameterizedTypeReference<T> typeRef) {
        return OkhttpUtil.httpPutByJson(this.httpClient, url, header, json, typeRef);
    }

    /**
     * put同步请求（FormBody表单）.
     *
     * @param url    路径（必填）
     * @param header 请求头（可选）
     * @param param  参数（可选）
     * @param clazz  返回值类型
     * @param <T>    泛型
     * @return T
     */
    public <T> T httpPutByForm(String url, Map<String, String> header, Map<String, Object> param, Class<T> clazz) {
        return OkhttpUtil.httpPutByForm(this.httpClient, url, header, param, clazz);
    }

    /**
     * put同步请求（FormBody表单）.
     *
     * @param url     路径（必填）
     * @param header  请求头（可选）
     * @param param   参数（可选）
     * @param typeRef 返回值类型
     * @param <T>     泛型
     * @return T
     */
    public <T> T httpPutByForm(String url, Map<String, String> header, Map<String, Object> param, ParameterizedTypeReference<T> typeRef) {
        return OkhttpUtil.httpPutByForm(this.httpClient, url, header, param, typeRef);
    }

    /**
     * put同步请求（MultipartBody表单）.
     *
     * @param url    路径（必填）
     * @param header 请求头（可选）
     * @param param  参数（可选）
     * @param files  文件集合（可选）
     * @param clazz  返回值类型
     * @param <T>    泛型
     * @return T
     */
    public <T> T httpPutByMultipart(String url, Map<String, String> header, Map<String, Object> param, List<MultipartFile> files, Class<T> clazz) {
        return OkhttpUtil.httpPutByMultipart(this.httpClient, url, header, param, files, clazz);
    }

    /**
     * put同步请求（MultipartBody表单）.
     *
     * @param url     路径（必填）
     * @param header  请求头（可选）
     * @param param   参数（可选）
     * @param files   文件集合（可选）
     * @param typeRef 返回值类型
     * @param <T>     泛型
     * @return T
     */
    public <T> T httpPutByMultipart(String url, Map<String, String> header, Map<String, Object> param, List<MultipartFile> files,
        ParameterizedTypeReference<T> typeRef) {
        return OkhttpUtil.httpPutByMultipart(this.httpClient, url, header, param, files, typeRef);
    }

    /**
     * delete同步请求（参数拼接）.
     *
     * @param url    路径（必填）
     * @param header 请求头（可选）
     * @param param  参数（可选）
     * @param clazz  返回值类型
     * @param <T>    泛型
     * @return T
     */
    public <T> T httpDelete(String url, Map<String, String> header, Map<String, Object> param, Class<T> clazz) {
        return OkhttpUtil.httpDelete(this.httpClient, url, header, param, clazz);
    }

    /**
     * delete同步请求（参数拼接）.
     *
     * @param url     路径（必填）
     * @param header  请求头（可选）
     * @param param   参数（可选）
     * @param typeRef 返回值类型
     * @param <T>     泛型
     * @return T
     */
    public <T> T httpDelete(String url, Map<String, String> header, Map<String, Object> param, ParameterizedTypeReference<T> typeRef) {
        return OkhttpUtil.httpDelete(this.httpClient, url, header, param, typeRef);
    }

    /**
     * delete同步请求（json）.
     *
     * @param url    路径（必填）
     * @param header 请求头（可选）
     * @param json   参数（必填）
     * @param clazz  返回值类型
     * @param <T>    泛型
     * @return T
     */
    public <T> T httpDeleteByJson(String url, Map<String, String> header, String json, Class<T> clazz) {
        return OkhttpUtil.httpDeleteByJson(this.httpClient, url, header, json, clazz);
    }

    /**
     * delete同步请求（json）.
     *
     * @param url     路径（必填）
     * @param header  请求头（可选）
     * @param json    参数（必填）
     * @param typeRef 返回值类型
     * @param <T>     泛型
     * @return T
     */
    public <T> T httpDeleteByJson(String url, Map<String, String> header, String json, ParameterizedTypeReference<T> typeRef) {
        return OkhttpUtil.httpDeleteByJson(this.httpClient, url, header, json, typeRef);
    }

    /**
     * delete同步请求（FormBody表单）.
     *
     * @param url    路径（必填）
     * @param header 请求头（可选）
     * @param param  参数（可选）
     * @param clazz  返回值类型
     * @param <T>    泛型
     * @return T
     */
    public <T> T httpDeleteByForm(String url, Map<String, String> header, Map<String, Object> param, Class<T> clazz) {
        return OkhttpUtil.httpDelete(this.httpClient, url, header, param, clazz);
    }

    /**
     * delete同步请求（FormBody表单）.
     *
     * @param url     路径（必填）
     * @param header  请求头（可选）
     * @param param   参数（可选）
     * @param typeRef 返回值类型
     * @param <T>     泛型
     * @return T
     */
    public <T> T httpDeleteByForm(String url, Map<String, String> header, Map<String, Object> param, ParameterizedTypeReference<T> typeRef) {
        return OkhttpUtil.httpDelete(this.httpClient, url, header, param, typeRef);
    }
}
